/*************************************************************************
    > File Name: unam.c
    > Author:		
    > Mail:		
    > Created Time: 2021年03月23日 星期二 11时56分36秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/utsname.h>

#define _GNU_SOURCE
#define UTS_LEN 1024

/*
 * function: getopt()
 * optarg：如果某个选项有参数，这包含当前选项的参数字符串
 * optind：argv 的当前索引值
 * opterr：正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数，并输出其错误信息
 * optopt：当发现无效选项字符时，即 getopt() 方法返回 ? 字符，optopt 中包含的就是发现的无效选项字符
 */

extern char *optarg;
extern int optopt, optind;

void usage(char *progma, char *optstr)
{
	printf("Usage: %s [%s]\n", progma, optstr);

}

int main(int argc, char *argv[])
{

	struct utsname un;
	char ch, *optstr = "asm:", buf[UTS_LEN];

	uname(&un);
	while ((ch = getopt(argc, argv, optstr)) != -1) {
		switch (ch) {
			case 'a':
				sprintf(buf, "%s%s%s%s%s%s", un.sysname, un.nodename, un.release, un.version, un.machine, un.__domainname);
				printf("%s\n", buf);
				break;
			case 's': printf("%s\n", un.sysname); break;
			case 'm':
				if (!strcmp(optarg, "machine"))
					printf("%s\n", un.machine);
				break;
			case '?':
				printf("get un-supported argument: '%c'\n", optopt);
				usage(argv[0], optstr);
				break;
		}
	}
	return 0;
}

